[小ネタ]Pythonの日付操作で一時的にロケールを変更する
はじめに
データアナリティクス事業本部のkobayashiです。
様々な国のデータを扱う機会があり、そこに含まれているデータの日付データの形式が国ごとに異っていました。その日付データをPythonスクリプトの日付型datetime
にする必要がありましたのでその方法をまとめます。
環境
- macOS Big Sur
- Python 3.8.10
localeモジュール
localeモジュールはPython標準ライブラリです。このモジュールはPythonでPOSIXロケールを扱う事ができるモジュールで、システムにインストールされているロケールを使って国に依存する書式設定を設定、取得が行なえます。
各国の日付データを扱う
Pythonスクリプト中でロケールを変更する際はlocale.setlocale()
を使います。また現在使用しているロケールを取得するにはlocale.getlocale()
を使います。
一つ注意点があるのですが、locale.setlocale()
はスレッドセーフでないのでマルチスレッドで使用する場合は注意が必要です。
また使用できるロケールは環境により異なるので予め確認しておく必要があります。
システムのロケールを確認する
localeコマンドで現在のロケールを確認します。
$ locale LANG="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_CTYPE="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_ALL=
次にインストールされているロケールを確認します。
$ locale -a en_NZ nl_NL.UTF-8 pt_BR.UTF-8 fr_CH.ISO8859-15 eu_ES.ISO8859-15 en_US.US-ASCII af_ZA bg_BG cs_CZ.UTF-8 fi_FI zh_CN.UTF-8 eu_ES sk_SK.ISO8859-2 nl_BE ....
ここで表示されたロケールがPythonスクリプト中でも使えますのでPythonスクリプトの実行環境により使えるロケールが変わりますので注意してください。
Pythonスクリプト中でロケールを変更してみる
では、ロケールを変更して一番日付表示でロケールの依存度がある月と曜日を表示するPythonスクリプトを実行してみます。
from datetime import datetime import locale # デフォルトのロケールで月と月の省略形と曜日を表示 print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A")) # 各国のロケールで月と月の省略形と曜日を表示 locale_list = ( "pt_PT.UTF-8", "de_DE.UTF-8", "es_ES.UTF-8", "ru_RU.UTF-8", "el_GR.UTF-8", "fi_FI.UTF-8", "ja_JP.UTF-8", ) for _l in locale_list: locale.setlocale(locale.LC_TIME, _l) print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A")) # Cロケール(デフォルトのロケール)で月と月の省略形と曜日を表示 locale.setlocale(locale.LC_TIME, "C") print(locale.getlocale(locale.LC_TIME), datetime.now().strftime("%B %b %A"))
実行結果
(None, None) November Nov Friday ('pt_PT', 'UTF-8') Novembro Nov Sexta Feira ('de_DE', 'UTF-8') November Nov Freitag ('es_ES', 'UTF-8') noviembre nov viernes ('ru_RU', 'UTF-8') ноября ноя пятница ('el_GR', 'UTF-8') Νοεμβρίου Νοε Παρασκευή ('fi_FI', 'UTF-8') Marraskuu Mar Perjantai ('ja_JP', 'UTF-8') 11月 11 金曜日 (None, None) November Nov Friday
この様な形でロケールごとに月・曜日の表示が変わり、locale.setlocale()
を使うことでPythonスクリプト内でロケールを変更して処理を行えることがわかりました。
まとめ
Pythonスクリプト中で一時的に使用するロケールを変更して国ごとに異なる日付フォーマットを扱ってみました。
最後まで読んで頂いてありがとうございました。